package cn.slg.module.system.service.pk.skill;


import cn.slg.module.system.dal.dataobject.state.PersistenceState;
import cn.slg.module.system.dal.dataobject.state.PropertyState;
import cn.slg.module.system.dal.dataobject.wujiang.WuJiangDO;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.List;
import java.util.function.Consumer;

import static cn.slg.module.system.dal.dataobject.state.State.isAffectedByPv;
import static cn.slg.module.system.service.pk.skill.AllSkill.allSkillFunc;
import static cn.slg.module.system.service.pk.utils.DieAndRescue.rescue;
import static cn.slg.module.system.service.pk.utils.Show.*;
import static cn.slg.module.system.service.pk.utils.Target.randomTargets;

public class CommandSKill {

    static {
        try {
            // 通过反射，拿到类对象
            Class<?> aClass = CommandSKill.class;

            // 拿到类对象所有声明的方法
            // getDeclaredMethods 能拿到所有的动态代理方法，而这些动态代理方法是private的，所以不能直接访问。
            // 因此，在这里用 getMethods() 拿到所有的方法，再只要静态方法
            Method[] methods = aClass.getMethods();

            // 遍历，只要静态方法
            for (Method method : methods) {
                if (Modifier.isStatic(method.getModifiers())) {
                    // 拿到类对象的静态方法
                    allSkillFunc.put(method.getName(), aClass.getMethod(method.getName(), Method.class, WuJiangDO.class, String.class, Byte.class, byte.class));
                }
            }
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
    }

    // 指挥_仁德载世
    // 发动概率：1级:100% 10级:100%
    // 每回合治疗我军群体（2人，治疗率34%→68%，受智力影响），并使其受到伤害降低4%（受智力影响），持续1回合，
    // 且有5%→10%概率对敌军单体施加虚弱（无法造成伤害）状态，持续1回合，自身为主将时，施加虚弱状态的概率提高至12.5%→25%
    // 解析：刘备这个战法，类似主动战法，在刘备行动时发动。
    // 面板治疗率 = 0.0378 * 等级 + 0.3022
    public static void renDeZaiShi(Method skill, WuJiangDO attacker, String skillName, Byte skillLevel, byte roundNumber) {
        if (roundNumber == 0) {
            // 指挥战法，准备回合，必定能够发动。
            skillNameShow(attacker, skillName);
            // [刘备]的[]效果已施加
            System.out.println(spacing2() + showName(attacker) + "的" + parcel1(skillName + parcel1("预备")) + "效果已施加");

        } else {
            System.out.println(spacing2() + showName(attacker) + "执行来自" + parcel1(skillName) + "的" + parcel1(skillName + parcel1("预备")) + "效果");

            // 确定技能施加的目标和个数
            // 先确定可选目标
            List<WuJiangDO> confirmChoiceRange = attacker.confirmChoiceRange(true);
            // 再基于技能效果,选中目标,
            List<WuJiangDO> targets = randomTargets(confirmChoiceRange, 2);

            // 治疗效果
            // 面板治疗率，
            Float cureRate = (float) (0.0378 * skillLevel + 0.3022);
            targets.forEach(target -> {
                Short rescue = rescue(true, attacker, target, cureRate, skillName);
                System.out.println(spacing2() + showName(target) + "恢复了兵力" + rescue + parcel2(target.getBingLi()));
            });

            // 受到伤害降低效果
            Float effectRate = 0.04f * isAffectedByPv(attacker.getPvZhiLi());
            targets.forEach(target -> {
                // 施加状态
                boolean canAdd = PropertyState.canAddState("受到伤害降低", attacker, target, skill, skillName, (byte) 1);
                if (canAdd) {
                    Consumer<WuJiangDO> begin = wuJiangDO -> {
                        wuJiangDO.setIsPhysicalHarmRate(wuJiangDO.getIsPhysicalHarmRate() * (1 - effectRate));
                        wuJiangDO.setIsMagicHarmRate(wuJiangDO.getIsMagicHarmRate() * (1 - effectRate));
                        // 生效时显示
                        propertyStateShow(wuJiangDO, "受到的谋略伤害降低了", true, effectRate, wuJiangDO::getIsMagicHarmRate);
                        propertyStateShow(wuJiangDO, "受到的兵刃伤害降低了", true, effectRate, wuJiangDO::getIsPhysicalHarmRate);
                    };

                    Consumer<WuJiangDO> end = wuJiangDO -> {
                        // 状态被取消时操作
                        wuJiangDO.setIsPhysicalHarmRate(wuJiangDO.getIsPhysicalHarmRate() / (1 - effectRate));
                        wuJiangDO.setIsMagicHarmRate(wuJiangDO.getIsMagicHarmRate() / (1 - effectRate));
                    };

                    // 添加该状态
                    PropertyState.addState(false, "受到伤害降低", attacker, target, skill, skillName, (byte) 1, begin, end);
                }

            });

            // 且有5%→10%概率对敌军单体施加虚弱（无法造成伤害）状态，持续1回合，自身为主将时，施加虚弱状态的概率提高至12.5%→25%
            // 施加虚弱效果
        }


    }


    public static void luanShiJianXiong(Method skill, WuJiangDO attacker, String skillName, Byte skillLevel, byte roundNumber) {
        // 指挥战法，准备回合，必定能够发动。
        if (roundNumber == 0) {
            System.out.println(spacing1() + "准备回合发动乱世奸雄");
            skillNameShow(attacker, skillName);
        } else {
            System.out.println(spacing1() + "战斗回合发动乱世奸雄");
        }


    }


}
